package br.com.sgh.arquitetura.service;

import java.io.Serializable;
import java.util.Collection;

import br.com.sgh.arquitetura.dao.DAO;
import br.com.sgh.arquitetura.dao.Entidade;

/**
 * <p> AbstractManutencaoService </p> <p> Descrição: Classe responsável pelas regras de negocio de caso de uso com
 * algumas operações de manutenção de entidade já definidas. </p> <br> <b>Empresa:</b> Chesf - Companhia Hidro Elétrica
 * do São Francisco
 * 
 * @author Rafael Veloso
 * @author Rafael Fontoura
 * @author Anderson Fonseca
 * @param <E> Entidade que será manipulada
 * @param <D> O Data Access Object que manipula a entidade
 * @version 1.0
 */
public abstract class AbstractManutencaoService<E extends Entidade, D extends DAO<E>> implements
		ManutencaoService<E, DAO<E>> {

	private static final long serialVersionUID = -5919648416323244024L;

	/**
	 * Retorna a instância do DAO que manipula a entidade.
	 * 
	 * @return o DAO que manipula a entidade
	 */
	public abstract D getDao();

	/**
	 * Insere em banco de dados instância de entidade
	 * 
	 * @param entidade a entidade a persistir
	 * @return a chave da mensagem de sucesso da operação
	 * @author Rafael Veloso
	 */
	public String inserir(E entidade) {
		getDao().inserir(entidade);
		return "mensagem.inserir.sucesso";
	};

	/**
	 * Insere em banco de dados instância de entidade
	 * 
	 * @param entidade a entidade a alterar
	 * @return a chave da mensagem de sucesso da operação
	 * @author Rafael Veloso
	 */
	
	public String alterar(E entidade) {
		getDao().alterar(entidade);
		return "mensagem.alterar.sucesso";
	}

	/**
	 * Insere ou altera em banco de dados instância de entidade
	 * 
	 * @param entidade a entidade a inserir ou alterar
	 * @return a chave da mensagem de sucesso da operação
	 * @author Rafael Veloso
	 */
	
	public String salvar(E entidade) {
		getDao().salvar(entidade);
		return "mensagem.salvar.sucesso";
	}

	/**
	 * Altera em banco de dados instância de entidade que não esteja em estado persistente
	 * 
	 * @param entidade a entidade mesclar
	 * @return a chave da mensagem de sucesso da operação
	 * @author Rafael Veloso
	 */
	
	public String mesclar(E entidade) {
		getDao().mesclar(entidade);
		return "mensagem.mesclar.sucesso";
	}

	/**
	 * Exclui do banco de dados instância de entidade
	 * 
	 * @param entidade a entidade a inserir ou alterar
	 * @return a chave da mensagem de sucesso da operação
	 * @author Rafael Veloso
	 */
	
	public String remover(E entidade) {
		getDao().remover(entidade);
		return "mensagem.remover.sucesso";
	}

	/**
	 * Exclui em banco de dados as instâncias da entidade
	 * 
	 * @param entidades a entidades a inserir ou alterar
	 * @return a chave da mensagem de sucesso da operação
	 * @author Rafael Veloso
	 */
	
	public String removerTodos(Collection<E> entidades) {
		getDao().removerTodos(entidades);
		return "mensagem.removertodos.sucesso";
	}
	
	/**
	 * Exclui em banco de dados entidades que têm os IDS passados como parâmetro
	 * 
	 * @param ids ids de entidades a remover
	 * @return a chave da mensagem de sucesso para a operação
	 * @author Rafael Fontoura
	 */
	public String removerTodosPorId(Collection<Serializable> ids) {
		getDao().removerTodosPorId(ids);
		return "mensagem.removertodos.sucesso";
	}

	/**
	 * Consulta entidades a partir de uma instância como parâmetro efetuando paginação.
	 *
	 * @param entidade	a entidade que serve como parâmetro
	 * @return	a coleção de entidades encontradas
	 * @author rafael.rodrigues
	 */
	public java.util.Collection<E> consultar(E entidade) {
		return getDao().consultar(entidade);
	}
	
	/**
	 * Consulta entidades a partir de uma instância como parâmetro efetuando paginação.
	 *
	 * @param entidade	a entidade que serve como parâmetro
	 * @return	a coleção de entidades encontradas
	 * @author rafael.rodrigues
	 */
	public Collection<E> consultar() {
		return getDao().consultar();
	}
	
	/**
	 * Consulta todas as entidades vindas do banco de dados.
	 *
	 * @return	a coleção de entidades encontradas
	 * @author rafael.rodrigues
	 */
	public Collection<E> listar() {
		return getDao().listar();
	}
	
	/**
	 * Consulta entidade pelo seu identificador.
	 *
	 * @return	a entidade encontrada pelo ID
	 * @author rafael.rodrigues
	 */
	public E obter(Serializable id) {
		return getDao().obter(id);
	}
	
	/**
	 * Consulta entidades pelos seus identificadores.
	 *
	 * @return	as entidades encontradas pelos IDs
	 * @author rafael.rodrigues
	 */
	public Collection<E> obter(Collection<Serializable> ids) {
		return getDao().obter(ids);
	}
}